package com.paradogs.framework.core.annoations.base;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;

import java.util.HashSet;
import java.util.Set;

/**
 * @author: yumi
 * @date: 2023/8/25  17:00
 * @Description: TODO
 */
public abstract class BaseScanner extends ClassPathBeanDefinitionScanner {

    public BaseScanner(BeanDefinitionRegistry registry) {
        super(registry);
    }

    /**
     * 扫描出满足条件的类或接口
     * @param basePackages
     * @return
     */
    public Set<BeanDefinition> findCandidateComponents(String... basePackages) {
        Set<BeanDefinition> candidateComponents = new HashSet<>();
        for (String basePackage : basePackages) {
            candidateComponents.addAll(findCandidateComponents(basePackage));
        }
        return candidateComponents;
    }

    /**
     * 扫描并注册未注册的 Bean
     * *ps: 使用 super.doScan() 时，已经注册到 Spring 的 Bean 不会被扫描到，super.doScan() 在扫描后会做注册操作
     * 该方法一般接口做代理注册时使用
     * @param basePackages
     * @return 注册成功的 Bean (已存在但仍注册的 Bean 不会返回)
     */
    public Set<BeanDefinition> findAndRegisterComponents(String... basePackages) {
        Set<BeanDefinitionHolder> beanDefinitionHolders = super.doScan(basePackages);
        Set<BeanDefinition> beanDefinitions = new HashSet<>();
        for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) {
            beanDefinitions.add(beanDefinitionHolder.getBeanDefinition());
        }
        return beanDefinitions;
    }

    public boolean isNeedRegister() {
        return false;
    }

}
